package com.yuw.dynamicproxy.service.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; // CGlib
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;

public class SpokesmanProxyHandler implements InvocationHandler{

    //被委托对象
    private Object delegate;

    /**
     *
     * @param delegate
     * @return
     */
    public Object newProxyInstance(Object delegate) {
        this.delegate = delegate;
        /*
         * java jdk1.3+ 提供了动态代理类生成类 Proxy：就是用来动态创建一个代理对象的类，它提供了许多的方法，用的最多的就是 newProxyInstance 这个方法
         * loader:　　一个ClassLoader对象，定义了由哪个ClassLoader对象来对生成的代理对象进行加载
         * interfaces: 一个Interface对象的数组，表示的是给需要代理的对象（被委托类）提供一组什么接口，如果提供了一组接口给它，
         *             那么这个代理对象就宣称实现了该接口(多态)，这样就能调用这组接口中的方法了
         * h:　　一个InvocationHandler对象，表示的是当这个动态代理对象在调用方法的时候，会关联到哪一个InvocationHandler对象（代理类）上
         */
        return Proxy.newProxyInstance(delegate.getClass().getClassLoader(), delegate.getClass().getInterfaces(), this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        Object result = null;
        try {
            Logger.getLogger(this.getClass().getSimpleName()).log(Level.INFO, new Date().toLocaleString() + " 新闻发布会马上开始.");
            // 使用java反射机制，代理类调用被托管类的具体业务方法，来代为管理整体流程，被托管类则需要只关注于自身业务内容即可
            result = method.invoke(delegate, args);
            Logger.getLogger(this.getClass().getSimpleName()).log(Level.INFO, new Date().toLocaleString() + " 新闻发布会结束.");
        } catch (Exception e){
            e.printStackTrace();
        }
        return result;
    }

}
